perm filename STORAG[MUS,LCS] blob
sn#309802 filedate 1977-10-13 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00004 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 SRATE←25600MAG←512/SRATENCHNS←1
C00005 00003 INSTRUMENT PNV
C00026 00004
C00029 ENDMK
C⊗;
SRATE←25600;MAG←512/SRATE;NCHNS←1;
ARRAY SINEWAVE(512),F2(512),F4(512),
F3(512),F5(512);
SYNTH(SINEWAVE); 1,1 999;
SEG(F2);1,1 1,90 0,100;
SEG(F3);1,1 1,100;
SEG(F4);1,1 .6,1.5 .3,5 .15,10 .15,100;
SEG(F5);0,1 0,30 .07,45 1,60 1,100;
ARRAY D1(1601),D2(1867),D3(2053),D4(2251),D5(347),D6(113),D7(37);
VARIABLE /DSIG;
INSTRUMENT REV;
REV1(DSIG,1601,.802,D1);
REV1(DSIG,1867,.773,D2);
REV1(DSIG,2053,.753,D3);
REV1(DSIG,2251,.753,D4);
REV2(U1+U2+U3+U4,347,.7,D5);
REV2(U5,113,.7,D6);
REV2(U6,37,.7,D7);
DSIG←0;
OUTA←OUTA+U7;
END;
INSTRUMENT PNV;
VARIABLE AMPL, DECAYLENGTH, FREQ1, MISTUNE,
PEDAL, DURATION, FREQ2, FREQ3, STRETCH1, STRETCH2,
INDEX1, INDEX2, INDEX3, SCFREQ, ALFREQ, TH1, TH2,
/DECAY, /AMP, /MOD1, /MOD2, /MOD3, /STR1, /STR2, /STR3,
/VIBWIDTH, /VIBFREQ, /VIBRATO, /SCFREQ2, /SCFREQ3;
I_ONLY BEGIN
DURATION ← P2; < SET IN SCORE;
FREQ1 ← P3; < SET IN SCORE;
IF FREQ1 < F/2 THEN FREQ1 ← FREQ1 - 10/FREQ1; < TUNING
IF FREQ1 > F*2 THEN FREQ1 ← FREQ1 + FREQ1/170; < TUNING
ALFREQ ← ALOG(FREQ1);
INDEX1 ← 43/(ALFREQ*ALFREQ);
INDEX2 ← ALFREQ*ALFREQ/125;
INDEX3 ← (225/FREQ1)-.05;
IF FREQ1< A/2 THEN BEGIN
INDEX1 ← 45/(ALFREQ*ALFREQ);
INDEX2 ← ALFREQ*ALFREQ/125;
INDEX3 ← (245/FREQ1)-.05;
END;
IF FREQ1< D/2 THEN BEGIN
INDEX1 ← 71/(ALFREQ*ALFREQ);
INDEX2 ← ALFREQ*ALFREQ/88;
INDEX3 ← (245/FREQ1)-.05;
END;
IF FREQ1< B/4 THEN BEGIN
INDEX1 ← 92/(ALFREQ*ALFREQ);
INDEX2 ← ALFREQ*ALFREQ/80;
INDEX3 ← (250/FREQ1)-.05;
END;
IF FREQ1< FS/4 THEN BEGIN
INDEX1 ← 97/(ALFREQ*ALFREQ);
INDEX2 ← ALFREQ*ALFREQ/54;
INDEX3 ← (280/FREQ1)-.05;
END;
IF FREQ1< D/4 THEN BEGIN
INDEX1 ← 103/(ALFREQ*ALFREQ);
INDEX2 ← ALFREQ*ALFREQ/50;
INDEX3 ← (280/FREQ1)-.05;
END;
IF FREQ1< A/8 THEN BEGIN
INDEX1 ← 110/(ALFREQ*ALFREQ);
INDEX2 ← ALFREQ*ALFREQ/40;
INDEX3 ← (300/FREQ1)-.05;
END;
IF FREQ1> AF THEN BEGIN
INDEX1 ← 28/(ALFREQ*ALFREQ);
INDEX2 ← ALFREQ*ALFREQ/250;
INDEX3 ← (150/FREQ1)-.05;
END;
IF FREQ1> D*2 THEN BEGIN
INDEX1 ← 18/(ALFREQ*ALFREQ);
INDEX2 ← ALFREQ*ALFREQ/400;
INDEX3 ← (80/FREQ1)-.05;
END;
IF FREQ1> A*2 THEN BEGIN
INDEX1 ← 10/(ALFREQ*ALFREQ);
INDEX2 ← ALFREQ*ALFREQ/500;
INDEX3 ← (15/FREQ1)-.05;
END;
IF FREQ1> C*4 THEN BEGIN
INDEX1 ← 6/(ALFREQ*ALFREQ);
INDEX2 ← ALFREQ*ALFREQ/700;
INDEX3 ← (10/FREQ1)-.05;
END;
IF FREQ1> G*4 THEN
INDEX3←INDEX2←INDEX1 ← 0;
AMPL ← P4-(P4*INDEX2/FREQ1); < SET IN SCORE
MISTUNE←ALFREQ/90;
FREQ2 ← FREQ1 + MISTUNE;
FREQ3 ← FREQ1 - MISTUNE;
DECAYLENGTH ← 30/ALFREQ;
SCFREQ ← FREQ1 * MAG;
SCFREQ2 ← FREQ2 * MAG;
SCFREQ3 ← FREQ3 * MAG;
PEDAL ← .03;
IF FREQ1 > FS * 4 THEN PEDAL ← .05;
STRETCH1 ← .01+FREQ1/50000;
STRETCH2 ← .02+FREQ1/40000;
TH1 ← 1;
IF FREQ1 < F/2 THEN TH1 ←0;
IF FREQ1 < F/2 THEN AMPL←AMPL*3/2;
TH2 ← 1;
IF FREQ1 < FS/4 THEN TH2 ←0;
IF FREQ1 < FS/4 THEN AMPL←AMPL*3/2;
END;
DECAY ← COSCIL (P4, MAG/P14, P6);
VIBWIDTH← INTRP(P8*MAG, P9*MAG, F3);
VIBFREQ ← INTRP(P10, P11, F3);
VIBRATO ← OSCIL (VIBWIDTH,MAG/VIBFREQ, SINEWAVE);
MOD1←COSCIL((SCFREQ+VIBRATO)*INDEX1*P13,(SCFREQ+VIBRATO)+STRETCH1,SINEWAVE);
MOD2←COSCIL((SCFREQ+VIBRATO)*INDEX2*P13,2*(SCFREQ+VIBRATO)+STRETCH2,SINEWAVE);
MOD3←COSCIL((SCFREQ+VIBRATO)*INDEX3*P13,4*(SCFREQ+VIBRATO)+STRETCH2,SINEWAVE);
STR1 ←CZOSCIL (DECAY,SCFREQ+VIBRATO+ MOD1 + MOD2 + MOD3, SINEWAVE);
STR2 ←CZOSCIL(DECAY,(SCFREQ2+VIBRATO+MOD1+MOD2+MOD3)*TH2, SINEWAVE);
STR3 ←CZOSCIL(DECAY,(SCFREQ3+VIBRATO+MOD1+MOD2+MOD3)*TH1, SINEWAVE);
DSIG←DSIG+(STR1+STR2+STR3)*PEDAL/3;
OUTA ← OUTA + (STR1+ STR2 + STR3)/3;
END;